在金融数据分析和商业智能项目中,数据导出是工作过程程的关键环节:
| 格式 | 扩展名 | 特点 | 适用场景 |
|---|---|---|---|
| XLS | .xls | Excel 97-2003格式,专有二进制格式 | 兼容老版本Excel |
| XLSX | .xlsx | Excel 2007+格式,基于Open XML标准 | 现代标准格式 |
| XLSB | .xlsb | pandas 可读取但不提供标准写入引擎 | 仅在独立转换工具验证后提供 |
| CSV | .csv | 纯文本,逗号分隔值 | 跨平台数据交换 |
Pandas主要通过 openpyxl 引擎写入XLSX文件,通过 xlsxwriter 引擎实现高级格式化。
写入Excel时,Pandas自动进行数据类型转换:
| Python类型 | Excel类型 |
|---|---|
int64 |
数值 |
float64 |
数值 |
datetime64 |
日期时间 |
bool |
逻辑值(TRUE/FALSE) |
str |
文本 |
特殊值处理:NaN 默认写为空单元格;inf 默认写为字符串 inf,也可用 na_rep/inf_rep 显式标记
data、df、startrow、na_rep 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。na_rep 的结果;同时写出方向、数量级或表格/图形结构。# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import numpy as np # 导入NumPy数值计算库
import pandas as pd # 导入Pandas数据分析库
import datetime as dt # 导入日期时间处理模块
data=[[dt.datetime(2020,1,1, 10, 13), 2.222, 1, True], # 定义列表data
[dt.datetime(2020,1,2), np.nan, 2, False], # 第二行数据(含缺失值NaN)
[dt.datetime(2020,1,2), np.inf, 3, True]] # 第三行数据(含无穷大inf)
df = pd.DataFrame(data=data,columns=["Dates", "Floats", "Integers", "Booleans"]) # 创建数据框df
df.index.name="index" # 设置数据框索引列的名称
# 将数据框导出至Excel文件,指定工作表名和写入参数
df.to_excel("written_with_pandas1.xlsx", sheet_name="Output",
startrow=1, startcol=1, index=True, header=True, # 设置写入Excel时的起始行列位置和索引/表头选项
na_rep="<NA>", inf_rep="<INF>") #
with pd.ExcelWriter("written_with_pandas2.xlsx") as writer: # 使用上下文管理器
# 将数据框写入Sheet1工作表的第2行第2列位置
df.to_excel(writer, sheet_name="Sheet1", startrow=1, startcol=1)
# 将数据框再次写入Sheet1工作表的第11行位置
df.to_excel(writer, sheet_name="Sheet1", startrow=10, startcol=1)
df.to_excel(writer, sheet_name="Sheet2") # 将数据框写入Excel文件
print(df) # 输出数据框数据运行后核对:核对 data、df、startrow、na_rep 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。
to_excel 关键参数详解(一)写入位置控制:
startrow=1:数据从Excel第2行开始(第1行留给报告标题等)startcol=1:数据从Excel第2列开始(第1列留给行号或其他标识)index=True:是否写入行索引header=True:是否写入列名这种灵活性允许在一个Excel文件中创建复杂的报表布局。
to_excel 关键参数详解(二)| 任务 | 参数 | 本例选择 | 检查含义 |
|---|---|---|---|
| 标出缺失值 | na_rep |
'<NA>' |
与真实空字符串区分 |
| 标出无穷值 | inf_rep |
'<INF>' |
避免误读为普通数值 |
下一步:导出后重新读取工作簿,逐列核对缺失值、无穷值、日期与布尔值是否仍保持预期语义。
ExcelWriter 使用Python的上下文管理器(Context Manager):
核心优势:
close() 方法同一次 writer 会按 startrow/startcol 定位写入;区域重叠会覆盖单元格。默认 mode='w' 创建 writer 时还会覆盖同名工作簿:
这允许创建复杂的报表布局,例如:
将不同类型的数据放在不同工作表:
优势:数据分区清晰、可按工作表设置权限、大数据集分表提高加载速度。
to_excel vs ExcelWriter 对比| 特性 | to_excel | ExcelWriter |
|---|---|---|
| 单工作表 | DataFrame.to_excel(path) |
DataFrame.to_excel(writer) |
| 多工作表 | 需共享 writer | writer 负责协调工作簿 |
| 同表多次写入 | 需共享 writer 并显式定位 | 重叠区域仍会覆盖 |
| 代码复杂度 | 简单 | 稍复杂 |
| 资源管理 | 自动 | 需用with语句 |
选择建议:简单导出用 to_excel,复杂报表用 ExcelWriter。
当处理大规模金融数据时(如百万级交易记录),需注意:
| 特性 | CSV | Excel |
|---|---|---|
| 文件大小 | 小(纯文本) | 大(包含格式) |
| 读取速度 | 快 | 慢 |
| 多工作表 | ✗ | ✓ |
| 格式化支持 | ✗ | ✓ |
| 跨平台兼容性 | 极好 | 需Excel |
选择建议:数据备份/拓展应用 → CSV;向非技术人员展示 → Excel;大数据量 → CSV或数据库。
to_excel() 是最基础的Excel导出方法,适合单表简单导出ExcelWriter 支持多工作表、同表多次写入等高级功能na_rep 和 inf_rep 参数处理特殊值的显示startrow 和 startcol 控制写入位置,实现灵活布局ExcelWriter 上下文管理器:from io import BytesIO # 使用内存文件避免外部副作用
import pandas as pd # 导入表格处理库
workbook_buffer=BytesIO() # 创建工作簿缓冲区
with pd.ExcelWriter(workbook_buffer,engine='openpyxl') as workbook_writer: # 确保退出时完整保存
pd.DataFrame({'value':[1.0,None]}).to_excel(workbook_writer,sheet_name='结果',index=False,na_rep='<NA>') # 写入结果表
workbook_buffer.seek(0) # 复位读取位置
print(pd.ExcelFile(workbook_buffer).sheet_names) # 回读工作表目录解释与拓展应用答案:Excel 适合人工审阅的多表提供,CSV 适合单表跨系统交换;长三角季度提供用回读行数、字段和哈希核对,不能只确认文件存在。
所用数据与字段:导出表含数值与缺失标记
参考代码或推导(平台保护块之外):
from io import BytesIO # 使用内存文件避免写入外部路径
import pandas as pd # 导入表格库
df=pd.DataFrame({'value':[1.0,None]}) # 创建输入
workbook_buffer=BytesIO() # 创建工作簿缓冲区
df.to_excel(workbook_buffer,index=False,na_rep='<NA>',engine='openpyxl') # 导出内存工作簿
workbook_buffer.seek(0) # 将读取位置复位
check=pd.read_excel(workbook_buffer,keep_default_na=False) # 回读验证
print(check.to_dict('records')) # 输出回读记录[商业大数据分析与应用]